Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: kkindof   发起时间: 2013-08-20 16:41 下午   回复: 9

Print Search
帖子排序:    
   2013-08-20, 16:41 下午
kkindof 离线,最后访问时间: 2014/7/12 2:53:28 kkindof

发帖数前75位
注册: 2011-11-10
发 贴: 15
一起来探讨个有意思的问题
Reply Quote
关于IRQL

在XP上raise irql的时候,只是把irql写到apic寄存器中(映射到0FFFE0080h,对这个地址的写会引发中断),并没用到pcr->irql字段(求证)

而WIN7,WIN8在raise的时候就使用到了pcr->irql这个字段
这里就引出一个问题:
pcr是CPU相关的,如果线程A提升到apc_level后,被线程B抢占进来,此时的pcr->irql还是保存着apc_level吗?
如果不是,在线程B切进来的时候怎么保证pcr->irql是正确的值??


对于APC来说,APC应该是线程相关的,而MS文档上提到raise irql提升到APC LEVEL可以禁止APC deliver(包括special kernel apc)
但由于raise irql 只是修改当前cpu的,而线程是有可能切换任意procesor上运行,这样的话,那怎么禁止apc deliver呢??




IP 地址: 已记录   报告
   2013-08-20, 22:36 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 一起来探讨个有意思的问题
Reply Quote

如果CPU已经在APC_LEVEL,那么它只可能处理比APC_LEVEL更高优先级的,DPC,中断之类的,不可能去执行线程B的。

处理中断并不切线程,中断处理好了,还是回到线程A的APC...

 


IP 地址: 已记录   报告
   2013-08-20, 22:45 下午
kkindof 离线,最后访问时间: 2014/7/12 2:53:28 kkindof

发帖数前75位
注册: 2011-11-10
发 贴: 15
Re: 一起来探讨个有意思的问题
Reply Quote
windows不是抢占式的吗?
APC那个线程在raise irql到apc后,时间片刚好用完,难道不会切到其它线程吗?而且线程切换是在dispatch_level下,不会因为APC_level导致不能切换

IP 地址: 已记录   报告
   2013-08-22, 22:39 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 一起来探讨个有意思的问题
Reply Quote

切到哪个线程呢?因为切换的一个原则是不能切换到比自己特权级别低的,当前是APC,所以是不可能切换到普通用户态线程的


IP 地址: 已记录   报告
   2013-08-23, 10:38 上午
kkindof 离线,最后访问时间: 2014/7/12 2:53:28 kkindof

发帖数前75位
注册: 2011-11-10
发 贴: 15
Re: 一起来探讨个有意思的问题
Reply Quote
OK,就按上面的说法,不能换到其它低于APC level的线程,如此说来应该有线程相关的变量存放着对应的线程的irql了?否则何来比较线程A和线程B的irql?但irql又应该是processor级别的,乱了。

暂且不说上面的。

WINDOWS下是抢占式的系统,我的理解,这是靠时钟中断,然后计算线程的时间片,强制把时间片到期的线程切到等待状态,然后把NextThread切进去执行。
按张老师你的说法假如那个到期的线程(所处的cpu)是在APC级别上,然后就不切NextThread了??


感觉这里还有点混乱,Apc_level  disable apc delivery,可apc delivery是线程级别,而Apc_level算CPU级别的吧?按理解apc_level不是cpu级别的吧,只是MS抽象的一个概念。。"曾经也在OSR的帖子上说,使用fastmute提高irql到apc_level的话,需要和各个processor交互,效率不好"


理解得还不是很透彻,要是方便的话,张老师帮忙梳理下。。。




IP 地址: 已记录   报告
   2013-08-26, 15:06 下午
WillingBug163 离线,最后访问时间: 2017/3/22 0:01:16 WillingBug163

发帖数前100位
注册: 2013-08-19
发 贴: 14
Re: 一起来探讨个有意思的问题
Reply Quote
你的这个问题和CPU的中断控制器相关,提升级别的同时也在屏蔽部分中断。在64位win7里面对级别的提升操作的是CR8这个寄存器,在文档中可以看到对它的设置,会影响PPR寄存器。如果提升到APC级别那么就屏蔽了特权>=1以下的中断,2号中断正好是你所说的线程任务切换用的。如果不恢复回去那么便不会在这个处理器上进行任务切换了。这也许便是文档中强调一定要再切回原来的级别。32位CPU中没有CR8,但我没有找到它操作PCR->IRQL的代码。但想必是一样的。张老师,不知道我说的对不对。呵呵。
IP 地址: 已记录   报告
   2013-08-28, 08:38 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 一起来探讨个有意思的问题
Reply Quote

IRQL一定是CPU的属性,Svr 2K3之前,就是记录在CPU的APIC中,2K3新增软件字段,主要是为了支持调试。

CPU在执行线程时,这个线程可以提升IRQL,所以有时也就混同来说线程某某的IRQL,其实是指这个线程在CPU的某一级IRQL执行(只用IRQL为0时才是执行自己的普通代码,其它时候都是“免费提供场地”被借用来执行特殊任务去了)。

对于APC,有一点特别容易误解的地方,就是APC任务有多种类型,Kernel Special,Kernel Normal,User  Normal,并不是所有这些类型的任务都是在APC_LEVEL执行的,User Normal的APC就是在PASSIVE(0)IRQL执行的。

这样的问题值得深究,但是三言两语很难说清,这几天会找个时间写篇博客,用调试的方法,再举些例子...

 


IP 地址: 已记录   报告
   2013-08-28, 10:08 上午
kkindof 离线,最后访问时间: 2014/7/12 2:53:28 kkindof

发帖数前75位
注册: 2011-11-10
发 贴: 15
Yes [Y] Re: 一起来探讨个有意思的问题
Reply Quote
raymond老师出手,值得期待!!!!
IP 地址: 已记录   报告
   2013-08-28, 13:52 下午
WillingBug163 离线,最后访问时间: 2017/3/22 0:01:16 WillingBug163

发帖数前100位
注册: 2013-08-19
发 贴: 14
Re: 一起来探讨个有意思的问题
Reply Quote
期待!
IP 地址: 已记录   报告
   2013-09-01, 22:14 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 一起来探讨个有意思的问题
Reply Quote
周末两天忙着写代码了,要等等,抱歉
IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » 一起来探讨个有意思的问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.